#include "chatserver.hpp"
#include"chatservice.hpp"
#include"json.hpp"
#include <functional>
#include<string>
using namespace std;
using namespace placeholders;
using json = nlohmann::json;
// 这里流程是一个固定的流程，对于io的操作全部交给muduo库执行，自己只需要注意到对于消息的操作就可以了
//这里只要集中开发服务模块就可以了
ChatServer::ChatServer(EventLoop *loop,
                       const InetAddress &ListenAddr,
                       const string &nameArg) : _server(loop, ListenAddr, nameArg), _loop(loop)
{
    // 注册链接回调
    _server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));

    // 注册消息回调
    _server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));

    // 设置线程数量
    _server.setThreadNum(4);//一个io线程，三个工作线程
}

void ChatServer::start()
{
    _server.start();
}

// 上报链接事件相关的回调函数
void ChatServer::onConnection(const TcpConnectionPtr &cnn) 
{
    //链接失败或用户下线
    if(!cnn->connected()){
        //ChatService::instance()->clientCloseException(conn);
        cnn->shutdown();
    }
}

void ChatServer::onMessage(const TcpConnectionPtr &conn,
                           Buffer *buffer,
                           Timestamp time)
{
    string buf = buffer->retrieveAllAsString();
    // 数据的反序列化
    json js = json::parse(buf);
    
    //达到的目的：完全解耦网络模块的代码和业务模块的代码
    // 通过json["msgid"] 获取 》》业务处理器handler》》conn js time
    auto msgHandler = ChatService::instance()->getHandler(js["msgid"].get<int>());
    //回调消息绑定好的事件处理，来执行相应的业务处理
    msgHandler(conn,js,time);
}